package com.sky.utils;

import org.apache.poi.ss.usermodel.*;

import javax.persistence.Column;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;
import javax.persistence.Table;

public class ExportUtils {

    public static <T> void exportData(HttpServletResponse response, List<T> dataList, Class<T> entityClass) throws IOException {
        // 创建Excel工作簿
        Workbook workbook = WorkbookFactory.create(true);

        // 创建工作表（使用实体类名作为sheet名）
        String sheetName = entityClass.getSimpleName();
        Sheet sheet = workbook.createSheet(sheetName);

        // 获取所有字段（包括私有字段）
        Field[] fields = entityClass.getDeclaredFields();

        // 创建表头行
        Row headerRow = sheet.createRow(0);
        int columnIndex = 0;

        // 遍历字段生成表头,加粗字体
        for (Field field : fields) {
            Column columnAnnotation = field.getAnnotation(Column.class);
            if (columnAnnotation != null) {
                // 获取列名（优先使用注解中的name，否则用字段名）
                String columnName = !columnAnnotation.name().isEmpty() ?
                        columnAnnotation.name() : field.getName();

                // 设置表头单元格
                Cell headerCell = headerRow.createCell(columnIndex);
                headerCell.setCellValue(columnName);

                // 设置字体样式
                Workbook workbook1 = headerCell.getSheet().getWorkbook();
                Font font = workbook1.createFont();
                font.setBold(true);
                CellStyle cellStyle = workbook1.createCellStyle();
                cellStyle.setFont(font);
                headerCell.setCellStyle(cellStyle);

                columnIndex++;
            }
        }


        // 填充数据（如果数据不为空）
        if (Objects.nonNull(dataList) && !dataList.isEmpty()) {
            int rowNum = 1; // 数据从第2行开始

            for (T data : dataList) {
                Row dataRow = sheet.createRow(rowNum);
                int cellNum = 0;

                for (Field field : fields) {
                    if (field.getAnnotation(Column.class) != null) {
                        Cell cell = dataRow.createCell(cellNum);
                        try {
                            field.setAccessible(true); // 允许访问私有字段
                            Object value = field.get(data);

                            // 直接输出原始值（不做任何格式转换）
                            if (value != null) {
                                cell.setCellValue(value.toString());
                            } else {
                                cell.setCellValue(""); // 空值处理
                            }
                        } catch (IllegalAccessException e) {
                            cell.setCellValue("[ERROR]");
                        }
                        cellNum++;
                    }
                }
                rowNum++;
            }
        }

        // 设置响应头
        String fileName = URLEncoder.encode(sheetName + ".xlsx", "UTF-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

        // 写入响应流并关闭资源
        workbook.write(response.getOutputStream());
        workbook.close();
    }
}


//package com.sky.utils;
//
//import org.apache.poi.ss.usermodel.*;
//
//import javax.persistence.Column;
//import javax.persistence.Table;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.lang.reflect.Field;
//import java.net.URLEncoder;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.Date;
//import java.util.List;
//import java.util.Locale;
//import java.util.Objects;
//
//public class ExportUtils {
//
//    public static <T> void exportData(HttpServletResponse response, List<T> dataList, Class<T> EntityClass) throws IOException {
//        // 创建Excel工作簿
//        Workbook workbook = WorkbookFactory.create(true);
//
//        // 创建工作表
////        Sheet sheet = workbook.createSheet("数据表");
//        Sheet sheet = workbook.createSheet(EntityClass.getSimpleName());
//
//        // 设置标题行的字体样式
//        Font font = workbook.createFont();
//        font.setBold(true); // 将字体设置为加粗样式
//
//        // 获取表名
//        Table tableAnnotation = EntityClass.getAnnotation(Table.class);
////        String tableName = EntityClass.getSimpleName(); // 获取的是UserDO（类的名字）
//        String tableName = "data";
//        if (tableAnnotation != null) {
//            tableName = tableAnnotation.name();
//        }
//
//        /**
//         *    创建标题行
//         * 1. 要根据实体类的 @Column(name = "姓名") 注解中的 name 值来设置标题行，
//         * 2. 你可以通过反射获取实体类的字段名称。
//         * 3. 可以使用 Class.getDeclaredFields() 方法来获取所有的字段，
//         * 4. 然后使用 Field.getAnnotation() 方法获取 @Column 注解，最后通过 name() 方法获取注解中设置的名称。
//         */
//        Row headerRow = sheet.createRow(0);
//        Field[] fields = EntityClass.getDeclaredFields();
//
//        // 遍历所有字段（包括所有带@Column注解的字段）
//        int columnIndex = 0;
//        for (Field field : fields) {
//            Column columnAnnotation = field.getAnnotation(Column.class);
//            if (columnAnnotation != null) {
//                // 获取列名（优先用注解的name，否则用字段名）
//                String columnName = columnAnnotation.name().isEmpty() ? field.getName() : columnAnnotation.name();
//
//                // 写入表头
//                Cell headerCell = headerRow.createCell(columnIndex);
//                headerCell.setCellValue(columnName);
//
//                // 写入数据（如果数据列表不为空）
//                if (dataList != null) {
//                    for (int i = 0; i < dataList.size(); i++) {
//                        Object entity = dataList.get(i);
//                        try {
//                            field.setAccessible(true); // 允许访问私有字段
//                            Object value = field.get(entity);
//
//                            // 创建数据行（如果不存在）
//                            Row dataRow = sheet.getRow(i + 1);
//                            if (dataRow == null) {
//                                dataRow = sheet.createRow(i + 1);
//                            }
//
//                            // 直接写入原始值（不处理任何格式，包括日期）
//                            Cell dataCell = dataRow.createCell(columnIndex);
//                            dataCell.setCellValue(value != null ? String.valueOf(value) : ""); // 任何类型转为String
//                        } catch (IllegalAccessException e) {
//                            throw new RuntimeException("导出失败: 无法读取字段 " + field.getName(), e);
//                        }
//                    }
//                }
//                columnIndex++;
//            }
//        }
//
//        /**
//         * 1. 可以使用反射获取实体类的字段数量，
//         * 2. 然后在循环中根据字段数来创建单元格
//         */
//        // 数据不为空-填充数据到Excel表格
//        // 数据为空，下载模板
//        if (Objects.nonNull(dataList)) {
//            int rowNumber = 1;
//            for (T data : dataList) {
//                Row row = sheet.createRow(rowNumber);
//
//                for (int i = 0; i < fields.length; i++) {
//                    Field field = fields[i];
//                    Column columnAnnotation = field.getAnnotation(Column.class);
//                    if (columnAnnotation != null) {
//                        Cell cell = row.createCell(i);
//                        setCellValue(cell, data, field);
//                    }
//                }
//
//                rowNumber++;
//            }
//        }
//
//        // 设置响应头信息
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        response.setCharacterEncoding("UTF-8");
//
//        String encodedTableName = URLEncoder.encode(tableName, "UTF-8");
//        String filename = encodedTableName + ".xlsx";
//        response.setHeader("Content-Disposition", "attachment; filename=" + filename);
//
//        // 将Excel写入响应输出流
//        workbook.write(response.getOutputStream());
//
//        // 关闭工作簿
//        workbook.close();
//    }
//
//    // 调用方法 setCellValue() 在 setCellValue() 方法中根据字段的类型来设置单元格的值
//    private static <T> void setCellValue(Cell cell, T data, Field field) {
//        field.setAccessible(true);
//        try {
//            Object value = field.get(data);
//
//            // 根据属性的类型来设置单元格的值
//            if (value instanceof Integer) {
//                cell.setCellValue((Integer) value);
//            } else if (value instanceof String) {
//                cell.setCellValue((String) value);
//            } else if (value instanceof Boolean) {
//                cell.setCellValue((Boolean) value);
//            } else if (value instanceof Date) {
//                DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
//                DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//                LocalDateTime dateTime = LocalDateTime.parse(value.toString(), sourceFormatter);
//                String convertedTime = dateTime.format(targetFormatter);
//                cell.setCellValue(convertedTime);
//
//            } else if (value instanceof Double) {
//                cell.setCellValue(value.toString());
//            } else {
//                // 处理其他类型的值
//            }
//        } catch (IllegalAccessException e) {
//            // 处理异常情况
//            e.printStackTrace();
//        }
//    }
//}
